      subroutine hybrd1(fcn,n,x,fvec,tol,info,wa,lwa)
      integer n,info,lwa
      double precision tol
      double precision x(n),fvec(n),wa(lwa)
      external fcn
!!$c     **********
!!$c
!!$c     subroutine hybrd1
!!$c
!!$c     the purpose of hybrd1 is to find a zero of a system of
!!$c     n nonlinear functions in n variables by a modification
!!$c     of the powell hybrid method. this is done by using the
!!$c     more general nonlinear equation solver hybrd. the user
!!$c     must provide a subroutine which calculates the functions.
!!$c     the jacobian is then calculated by a forward-difference
!!$c     approximation.
!!$c
!!$c     the subroutine statement is
!!$c
!!$c       subroutine hybrd1(fcn,n,x,fvec,tol,info,wa,lwa)
!!$c
!!$c     where
!!$c
!!$c       fcn is the name of the user-supplied subroutine which
!!$c         calculates the functions. fcn must be declared
!!$c         in an external statement in the user calling
!!$c         program, and should be written as follows.
!!$c
!!$c         subroutine fcn(n,x,fvec,iflag)
!!$c         integer n,iflag
!!$c         double precision x(n),fvec(n)
!!$c         ----------
!!$c         calculate the functions at x and
!!$c         return this vector in fvec.
!!$c         ---------
!!$c         return
!!$c         end
!!$c
!!$c         the value of iflag should not be changed by fcn unless
!!$c         the user wants to terminate execution of hybrd1.
!!$c         in this case set iflag to a negative integer.
!!$c
!!$c       n is a positive integer input variable set to the number
!!$c         of functions and variables.
!!$c
!!$c       x is an array of length n. on input x must contain
!!$c         an initial estimate of the solution vector. on output x
!!$c         contains the final estimate of the solution vector.
!!$c
!!$c       fvec is an output array of length n which contains
!!$c         the functions evaluated at the output x.
!!$c
!!$c       tol is a nonnegative input variable. termination occurs
!!$c         when the algorithm estimates that the relative error
!!$c         between x and the solution is at most tol.
!!$c
!!$c       info is an integer output variable. if the user has
!!$c         terminated execution, info is set to the (negative)
!!$c         value of iflag. see description of fcn. otherwise,
!!$c         info is set as follows.
!!$c
!!$c         info = 0   improper input parameters.
!!$c
!!$c         info = 1   algorithm estimates that the relative error
!!$c                    between x and the solution is at most tol.
!!$c
!!$c         info = 2   number of calls to fcn has reached or exceeded
!!$c                    200*(n+1).
!!$c
!!$c         info = 3   tol is too small. no further improvement in
!!$c                    the approximate solution x is possible.
!!$c
!!$c         info = 4   iteration is not making good progress.
!!$c
!!$c       wa is a work array of length lwa.
!!$c
!!$c       lwa is a positive integer input variable not less than
!!$c         (n*(3*n+13))/2.
!!$c
!!$c     subprograms called
!!$c
!!$c       user-supplied ...... fcn
!!$c
!!$c       minpack-supplied ... hybrd
!!$c
!!$c     argonne national laboratory. minpack project. march 1980.
!!$c     burton s. garbow, kenneth e. hillstrom, jorge j. more
!!$c
!!$c     **********
      integer index,j,lr,maxfev,ml,mode,mu,nfev,nprint
      double precision epsfcn,factor,one,xtol,zero

      EXTERNAL hybrd

      data factor,one,zero /1.0d2,1.0d0,0.0d0/
      info = 0
!!$c
!!$c     check the input parameters for errors.
!!$c
      if (n .le. 0 .or. tol .lt. zero .or. lwa .lt. (n*(3*n + 13))/2) &
          go to 20
!!$c
!!$c     call hybrd.
!!$c
      maxfev = 200*(n + 1)
      xtol = tol
      ml = n - 1
      mu = n - 1
      epsfcn = zero
      mode = 2
      do 10 j = 1, n
         wa(j) = one
   10    continue
      nprint = 0
      lr = (n*(n + 1))/2
      index = 6*n + lr

      call hybrd(fcn,n,x,fvec,xtol,maxfev,ml,mu,epsfcn,wa(1),mode, &
                 factor,nprint,info,nfev,wa(index+1),n,wa(6*n+1),lr, &
                 wa(n+1),wa(2*n+1),wa(3*n+1),wa(4*n+1),wa(5*n+1))
      if (info .eq. 5) info = 4
   20 continue
      return
!!$c
!!$c     last card of subroutine hybrd1.
!!$c
      end subroutine
